/*
 * servletConexion.java
 * 0.3 11/11/2012
 *
 * Authors: José Luis Urbano Orgaz (joseluislikebetter@hotmail.com)
 *          Milagros Membrillo Jimenez
 *
 * Copyright: This file is part of E-Man.
 *   
 *   E-Man is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *  
 *   E-Man is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *   GNU General Public License for more details.
 *  
 *   You should have received a copy of the GNU General Public License
 *   along with E-Man.  If not, see <http://www.gnu.org/licenses/>.
 */
package Logica;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Clase gestora del programa
 * @author Milagros Membrillo
 * @author José Luis Urbano Orgaz
 */
@WebServlet(name = "servletConexion", urlPatterns = {"/servletConexion"})
public class servletConexion extends HttpServlet {

    private Connection con;
    private Statement st;
    private ResultSet rs;
    
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String sentencia="";
        
            try{
            sentencia=ObtenerSQL(request,out);
            }catch(Exception e)
            {
                out.println("peta");
            }

        
        try {
            servletConexion c = new servletConexion();
            c.abrirConexion(out);//Solo se realiza una vez
            c.PrepararSentencia();//Solo se realiza una vez
            sentencia=ObtenerSQL(request, out);
            if (request.getParameter("modo").equals("medicion"))
            {
                c.EjecutarActualizacion(sentencia);
                out.print("se ha actualizado la bd");
            }
            else
            {
                
                c.EjecutarConsulta(sentencia);
                out.print(c.ProcesarResultado(request.getParameter("modo"),out));
            }
            c.cerrarConexion();//Solo se realiza una vez
        } catch (Exception e) {
            out.println("Se ha producido una excepción en el acceso a la Base de Datos");
        }
        
        out.close();
    }
    
    /**
     * Permite obtener una sentencia SQL a partir de los parámetros recibidos
     * @param request Parámetros recibidos
     * @return SQL correspondiente al modo de ejecución del servlet
     */
    private String ObtenerSQL(HttpServletRequest request, PrintWriter out) throws UnsupportedEncodingException
    {
        String sql="";
        String modo=request.getParameter("modo");
        if(modo.equals("provincias"))
        {
            sql="select * from provincias";
        }
        else
        {
        if (modo.equals("localidades"))
        {
                //String valueUtf8 = new String(request.getParameter("provincia"));
                sql="select po.CodigoPoblacion, po.Poblacion from poblaciones po where po.CodigoProvincia=";
                String provincia=request.getParameter("provincia");//valueUtf8;
                sql=(sql.concat(provincia)).concat(";");
        }
        else
        {
            if (modo.equals("calles"))
            {
                sql="select ca.idCalle,ca.Nombre from  callespoblaciones ca where ca.CodPoblacion=";
                String poblacion=request.getParameter("poblacion");
                sql=(sql.concat(poblacion)).concat(";");
            }
            else
            {
                if(modo.equals("clientes"))
                {
                    sql="select cl.Codigo,cl.Nombre,cl.Apellido,cl.Apellido2 from  clientes cl where cl.Calle=";
                    String calle=request.getParameter("calle");
                    sql=(sql.concat(calle)).concat(";");
                }
                else
                {
                    if(modo.equals("medicion"))
                    {
                        String cliente=request.getParameter("cliente");
                        String medida=request.getParameter("medida");
                        String hora=getDateTime();
                        sql="INSERT INTO mediciones (Cliente, FechaHora, KW) VALUES (";
                        sql=(((((sql.concat(cliente)).concat(",")).concat("'"+hora+"'")).concat(",")).concat(medida)).concat(");");
                    }
                    else
                    {
                        //No realiza ninguna acción: Fallo
                        sql="llega aqui bien";
                    }
                }
                
            }
        }
        }
        return sql;
    }

    /**
     * Prepara el código java para lanzar sentencias
     *
     * @throws SQLException Lanza excepción en lugar de capturarla
     */
    public void PrepararSentencia() throws SQLException {
        st = con.createStatement();
    }
    
    /**
     * Establece la conexión con la BD
     *
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public void abrirConexion(PrintWriter out) throws InstantiationException, IllegalAccessException {

        try {
            String userName = "Invitado";
            String password = "liker";

            String url = "jdbc:mysql://127.0.0.1/consumoelectrico";

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(url, userName, password);

            out.println("Conexion a la BD");

        } catch (ClassNotFoundException e) {
            // Error. No se ha encontrado el driver de la BD
           // e.printStackTrace();
            out.println("vaya chaco");
        } catch (SQLException e) {
            // Error. No se ha podido conectar a la BD
            //e.printStackTrace();
        }
    }

    /**
     * Ejecuta cada consulta, recibiendo el nombre de la consulta a devolver
     *
     * @param consulta
     * @throws SQLException
     */
    private void EjecutarConsulta(String consulta) throws SQLException {
            rs = st.executeQuery(consulta);       
    }
    
    private void EjecutarActualizacion(String consulta) throws SQLException {
            st.executeUpdate(consulta);      
    }

    /**
     * Cierra la conexión con la BD
     */
    public void cerrarConexion() {
        try {
            con.close();
            //out.println("Conexion cerrada");
        } catch (SQLException e) {
            //out.println("Error al cerrar conexion");
        }
    }
    
    /**
     * Procesa el resultado producido por la base de datos
     * @param modo
     * @param out
     * @return
     * @throws SQLException 
     */
    public String ProcesarResultado(String modo,PrintWriter out) throws SQLException {
        out.print("LLega a procesar resultado por posicion");
        String cadenaDevolver="";
        rs.beforeFirst();
        if (modo.equals("provincias"))
        {
        while (rs.next()) {
            cadenaDevolver=cadenaDevolver.concat(rs.getString("CodigoProvincia"));
            cadenaDevolver=cadenaDevolver.concat(",");
            cadenaDevolver=cadenaDevolver.concat(rs.getString("Provincia"));
            cadenaDevolver=cadenaDevolver.concat("|");
        }
        }else
        {
            if (modo.equals("localidades"))
            {
                while (rs.next()) {
                cadenaDevolver=cadenaDevolver.concat(rs.getString("CodigoPoblacion"));
                cadenaDevolver=cadenaDevolver.concat(",");
                cadenaDevolver=cadenaDevolver.concat(rs.getString("Poblacion"));
                cadenaDevolver=cadenaDevolver.concat("|");
                }
            }
            else
            {
                if (modo.equals("calles"))
                {
                    while (rs.next()) {
                    cadenaDevolver=cadenaDevolver.concat(rs.getString("idCalle"));
                    cadenaDevolver=cadenaDevolver.concat(",");
                    cadenaDevolver=cadenaDevolver.concat(rs.getString("Nombre"));
                    cadenaDevolver=cadenaDevolver.concat("|");
                    }
                }
                else
                {  
                    if (modo.equals("clientes"))
                    {
                        while (rs.next()) {
                        cadenaDevolver=cadenaDevolver.concat(rs.getString("Codigo"));
                        cadenaDevolver=cadenaDevolver.concat(",");
                        cadenaDevolver=cadenaDevolver.concat(rs.getString("Nombre"));
                        cadenaDevolver=cadenaDevolver.concat(",");
                        cadenaDevolver=cadenaDevolver.concat(rs.getString("Apellido"));
                        cadenaDevolver=cadenaDevolver.concat(",");
                        cadenaDevolver=cadenaDevolver.concat(rs.getString("Apellido2"));
                        cadenaDevolver=cadenaDevolver.concat("|");
                        }
                    }
                }
            }
        }
        return cadenaDevolver;
    }
    
    /**
     * Halla la fecha actual
     * @return fecha convertida a String
     */
    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date);
    }
        //Recuperando strings nos curamos en salud, ya que si fuera un entero... siempre podríamos
        //recuperarlo con un parseInt
    
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
